//! provide utils trait for program

use json::JsonValue;

pub trait ToJsonValue {
    fn to_json(&self) -> JsonValue;
}

pub trait JsonValueTo {
    /// if value is null, return default String
    fn null_or_string(&self, val: String) -> String;
}

impl ToJsonValue for &str {
    fn to_json(&self) -> JsonValue {
        if let Ok(n) = self.parse::<i64>() {
            json::JsonValue::from(n)
        } else if let Ok(n) = self.parse::<f64>() {
            json::JsonValue::from(n)
        } else if (*self).eq("null") {
            json::JsonValue::Null
        } else {
            json::JsonValue::String(self.to_string())
        }
    }
}

impl ToJsonValue for String {
    fn to_json(&self) -> JsonValue {
        if let Ok(n) = self.parse::<i64>() {
            json::JsonValue::from(n)
        } else if let Ok(n) = self.parse::<f64>() {
            json::JsonValue::from(n)
        } else if self.eq("null") {
            json::JsonValue::Null
        } else {
            json::JsonValue::String(self.to_string())
        }
    }
}

impl JsonValueTo for JsonValue {
    /// if value is null, return default String
    fn null_or_string(&self, val: String) -> String {
        if self.is_null() {
            return val;
        }

        self.to_string()
    }
}
